package com.ssy.lingxi.order.service.base;

import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.order.entity.OrderDO;
import com.ssy.lingxi.order.model.bo.VendorBO;
import com.ssy.lingxi.order.model.dto.OrderSeparateDTO;
import com.ssy.lingxi.order.model.vo.basic.request.OrderDeductionVO;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 订单积分抵扣相关接口
 * @author wyx
 * @version 2.0.0
 * @date 2022-03-02
 **/
public interface IBaseOrderDeductionService {
    /**
     * 校验、保存订单关联的积分抵扣列表
     * @param order      订单
     * @param deductions 积分抵扣列表
     * @return 保存结果
     */
    Wrapper<Void> checkOrderDeduction(OrderDO order, List<OrderDeductionVO> deductions,Map<VendorBO, BigDecimal> pointsMap);

    /**
     * 订单取消，返还已抵扣的积分
     * @param order      订单
     * @return 操作结果
     */
    Wrapper<Void> returnDeductionPoints(OrderDO order);

    /**
     * （拆单）根据拆单订单商品金额总和，加权平均计算拆单后的积分抵扣金额
     * @param separateSkuMap 拆单商品Sku列表
     * @param skuCouponMap   Sku积分抵扣减少的金额
     * @return 拆单订单优惠券金额
     */
    Map<OrderSeparateDTO, BigDecimal> findSeparateOrderDeductionAmount(Map<OrderSeparateDTO, List<Long>> separateSkuMap, Map<Long, BigDecimal> skuCouponMap);

    /**
     * 供应商积分抵扣比例
     * @param deductions 积分抵扣列表
     * @return 积分抵扣比例
     */
    Map<VendorBO, BigDecimal> vendorCalculateDeductionPoints(List<OrderDeductionVO> deductions);
}
